// Copyright (C) Kumo inc. and its affiliates.
// Author: Jeff.li lijippy@163.com
// All rights reserved.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
//

#include <iostream>

#include <nebula/filesystem/filesystem.h>


namespace fs = nebula::fs;

// Demonstrate dynamically loading a user-defined Nebula FileSystem

turbo::Status execute() {
  TURBO_RETURN_NOT_OK(nebula::fs::LoadFileSystemFactories(FILESYSTEM_EXAMPLE_LIBPATH));

  std::string uri = "example:///example_file";
  std::cout << "Uri: " << uri << std::endl;

  std::string path;
  TURBO_MOVE_OR_RAISE(auto fs, nebula::fs::FileSystemFromUri(uri, &path));
  std::cout << "Path: " << path << std::endl;

  fs::FileSelector sel;
  sel.base_dir = "/";
  TURBO_MOVE_OR_RAISE(auto infos, fs->GetFileInfo(sel));

  std::cout << "Root directory contains:" << std::endl;
  for (const auto& info : infos) {
    std::cout << "- " << info << std::endl;
  }
  return turbo::OkStatus();
}

int main() {
  auto status = execute();
  if (!status.ok()) {
    std::cerr << "Error occurred : " << status.message() << std::endl;
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}
